﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDAL;
using ForrajeriaDB;
using System.Transactions;

namespace ForrajeriaBCL
{
   public class UsuarioBCL 
    {
         private UsuariosDAL UserDAL;
        
        public UsuarioBCL()
        {
            UserDAL = UsuariosDAL.Instance; //consumiendo patron SINGLETON
        }


        public List<UsuarioMO> getALL()
        {
            try
            {
                return UserDAL.GetAll();
            }
            catch (Exception ex)
            {
                throw new Exception("Error: " + ex.Message);
            }

        }

        public string getTipoUsuario(int codigo)
        {
            return UserDAL.getTipo(codigo);
        }


        public string Adicionar(UsuarioMO objUser,string tipo, ClienteMO objCliente = null, EmpleadoMO objEmpleado = null )
        {
            try
            {


                using (TransactionScope tra = new TransactionScope())
                {

                    int reto;
                    

                    if (tipo == "cliente")
                    {
                        objUser.CodigoCliente = objCliente.Codigo;
                        reto = UserDAL.Adicionar(objUser);
                        ClienteDAL cliDAL = ClienteDAL.getInstance;
                        ClienteMO objClienteNue = objCliente;
                        objClienteNue.Usuario = reto;
                        cliDAL.Actualizar(objClienteNue, objCliente);
                    }

                    if (tipo == "empleado")
                    {
                        objUser.CodigoEmpleado= objEmpleado.Codigo;
                        reto = UserDAL.Adicionar(objUser);
                        EmpleadoDAL empDAL = EmpleadoDAL.Instance;
                        EmpleadoMO objEmpNuevo = objEmpleado;
                        objEmpNuevo.CodigoUsuario = reto;
                        empDAL.Actualizar(objEmpNuevo, objEmpleado);
                    }
                    
                    tra.Complete();


                }
                return "1";
            }
            catch (Exception ex)
            {
                throw new Exception("Error: " + ex.Message);
            }
            
        }
     
       public UsuarioMO getUser(String Usuario, String Password)
        {
            try
            {
                UsuarioMO item = new UsuarioMO();
                item.User = Usuario;
                item.Contrasenia = Password;
                //********************* Fin Carga Parametro ******************************

                UsuarioMO reto = new UsuarioMO();
                reto = UserDAL.valUser(item);
                //************************************************************************

                return reto;
                
            }


            catch(Exception ex)
            {
                if (ex.Message.Contains("user no encontrado"))
                {
                    throw new Exception("Usuario No Encontrado");
                }
                else
                {
                    throw new Exception("Error en Base de Datos");
                }

            }
            
        }


        public List<EmpleadoMO> getEmpBusqueda()
        {
            List<EmpleadoMO> lista = new List<EmpleadoMO>();
            List<TipoDocumentoMO> listaDoc = new List<TipoDocumentoMO>();
            try
            {

                TipoDocumentoDAL objTipoDocDAL = TipoDocumentoDAL.Instance;
                EmpleadoDAL objEmpDAL = EmpleadoDAL.Instance;

                listaDoc = objTipoDocDAL.GetAll();
                lista = objEmpDAL.getAllRegistrar();

                foreach (EmpleadoMO aux in lista)
                {
                    foreach (TipoDocumentoMO aux2 in listaDoc)
                    {
                        if (aux.TipoDocumento == aux2.Codigo)
                       { 
                            aux.Estado = aux2.TipoDocumento1; //para obtener el valor del nombre en vez de agregar un parametro mas a los objetosMO 
                            //modifico el valor del estado total no es usado 
                        }

                    }
                }

                return lista;
            }
            catch
            {
                throw new Exception("Error De Lectura de la Base de Datos");
            }
        }


        public List<ClienteMO> getCliBusquedaRegistrar()
        {
            List<ClienteMO> lista = new List<ClienteMO>();
            List<TipoDocumentoMO> listaDoc = new List<TipoDocumentoMO>();
            try
            {

                TipoDocumentoDAL objTipoDocDAL = TipoDocumentoDAL.Instance;
                ClienteDAL objCliDAL = ClienteDAL.getInstance;

                listaDoc = objTipoDocDAL.GetAll();
                lista = objCliDAL.GetAllRegistrar();

                foreach (ClienteMO aux in lista)
                {
                    foreach (TipoDocumentoMO aux2 in listaDoc)
                    {
                        if (aux.TipoDocumento == aux2.Codigo)
                        {
                            aux.EstadoClie = aux2.TipoDocumento1; //para obtener el valor del nombre en vez de agregar un parametro mas a los objetosMO 
                            //modifico el valor del estado total no es usado 
                        }

                    }
                }

                return lista;
            }
            catch
            {
                throw new Exception("Error De Lectura de la Base de Datos");
            }
        }

        public UsuarioMO ComprobarDisponibilidad(string nombre)
        {
            
            return UserDAL.getByName(nombre);
        }

        public string ModificarPass(UsuarioMO item)
        {
            try
            {

                return UserDAL.ModificarUserPass(item);

            }
            catch (Exception ex)
            {
                throw new Exception("Error: " + ex.Message);
            }

        }
     
        public string Eliminar(int codUsuario,string tipo, ClienteMO objCliente = null, EmpleadoMO objEmpleado = null)
        {
              try
            {


                using (TransactionScope tra = new TransactionScope())
                {

                    int reto;
                    

                    if (tipo == "cliente")
                    {
                        UserDAL.Eliminar(codUsuario);
                        ClienteDAL cliDAL = ClienteDAL.getInstance;
                        ClienteMO objClienteNue = objCliente;
                        objClienteNue.Usuario = null;
                        cliDAL.Actualizar(objClienteNue, objCliente);
                    }

                    if (tipo == "empleado")
                    {                     
                        UserDAL.Eliminar(codUsuario);
                        EmpleadoDAL empDAL = EmpleadoDAL.Instance;
                        EmpleadoMO objEmpNuevo = objEmpleado;
                        objEmpNuevo.CodigoUsuario = null;
                        empDAL.Actualizar(objEmpNuevo, objEmpleado);
                    }
                    
                    tra.Complete();


                }
                return "1";
            }
            catch (Exception ex)
            {
                throw new Exception("Error: " + ex.Message);
            }
            
        }
        }


    }

